追蹤服務的主要功用是對應用程式或系統進行即時監控並取得詳細報告。它讓我們能夠監測到應用程式或系統實際的效能,並擷取到任何可能出現的問題,即使是在非常早期的階段,如此一來就能夠盡早解決這些問題,避免其成為大問題。此外,追蹤服務也可以幫助我們了解使用者在您的應用程式或系統中實際的使用情形。
其中我最常使用的追蹤服務是 Sentry,可以使用他們的 SaaS 服務或是自建服務 [1],它原本主要是應用程式的錯誤追蹤,現在還有效能監測、事件通知與使用者回報等功能,並且它能夠跟前端、後端、行動應用與遊戲引擎等 85 種平台。
下面我們試著使用 Sentry 的 SaaS 服務,並將我們的 Strawberry Django 整合 Sentry SDK,首先第一步到 https://sentry.io/signup 註冊 Sentry 的帳號,接著按照操作提示建立專案,那專案的應用程式平台就選擇 Django,接下來會出現 Django 專案整合 Sentry SDK 的提示,依照我們的專案,使用以下方式整合 Sentry SDK。
將原本的pip
安裝方式改成用poetry
:
$ poetry add "sentry-sdk[django]"
Django 設定裡面加入 Sentry SDK 初始化:
# server/settings.py
# ... 省略
+import os
from pathlib import Path
+import sentry_sdk
+from sentry_sdk.integrations.django import DjangoIntegration
+from sentry_sdk.integrations.strawberry import StrawberryIntegration
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# ... 省略
+sentry_sdk.init(
+ dsn=os.environ.get("SENTRY_DSN"),
+ # Set traces_sample_rate to 1.0 to capture 100%
+ # of transactions for performance monitoring.
+ traces_sample_rate=1.0,
+ # Set profiles_sample_rate to 1.0 to profile 100%
+ # of sampled transactions.
+ # We recommend adjusting this value in production.
+ profiles_sample_rate=1.0,
+ integrations=[
+ # Set async_execution to True if you have at least one async resolver
+ StrawberryIntegration(async_execution=False),
+ DjangoIntegration(
+ transaction_style="url",
+ ),
+ ],
+ send_default_pii=True,
+)
原本dsn
的值是寫死在程式碼的 Sentry URL 字串,這邊改成讀取環境變數SENTRY_DSN
的值,使用StrawberryIntegration
是整合 Strawberry 的設定,因為我們是跑同步的程式,所以async_execution
設為False
,以及設定與 Django 整合用DjangoIntegration
。
然後寫死在程式碼的 Sentry URL,改成用環境變數,又或是使用 Dotenv,下面使用環境變數的方式,設定完後就可以重新執行runserver
:
$ export SENTRY_DSN=https://xxxxxx.ingest.sentry.io/xxxxxxx
$ python manage.py runserver
接著新增一個會產生錯誤 GraphQL 功能:
# server/app/blog/graph/queries.py
# ... 省略
@strawberry.type
class Query:
# ... 省略
+ test_error: float = strawberry.field(resolver=lambda: 1 / 0)
增加一個除以零錯誤的測試錯誤功能後,執行看看:
最後我們到 Sentry 的介面上可以看到類似下面的錯誤記錄:
我們可以在 Sentry 上看到非常詳細的錯誤資訊,包含客戶端的一些連線資訊、使用平台、系統版本、Python 程式的錯誤追蹤歷程、客戶端 HTTP 資訊以及我們系統的環境資訊等等。
由於我們在本地測試,也沒有足夠使用者使用,所以無法在 Sentry 上看到系統效能監測資訊。
如果在 Strawberry 的擴充功能列表 [2] 看到 Sentry 追蹤擴充,請不要使用,在 Sentry 的文件有提到如果與StrawberryIntegration
同時使用,它會被停用 [3]。
另外 Strawberry 的擴充功能列表也有整合這些追蹤服務:
這次修改內容可以參考 Git commit: